/*****************************************************************************
* file  : systask.c
* creat : apleilx
* data  : 2017/11/05
*******************************************************************************/
#define _SYSTASK_MODULE_
#include "os_obj.h"
#include "sys_task.h"
#include "pincfg.h"
#include "common.h"
#include "swap.h"
#include "nor_cmd.h"
#include "bsp_api.h"
#include "fun_list.h"

/*****************************************************************************
* @brief   fun.
*****************************************************************************/
void sw_iic_opt(void);
void sys_flash_init(void);
void sys_led_ctr(void);
void nor_flash_demo(void);
void sys_tick_exe(void);
void system_info(void);
void str_demo(void);
void sys_par_load(void);

FUN_LIST_REF(nsys);
FUN_LIST_REF(napp);

/*****************************************************************************
* @brief   var.
*****************************************************************************/


/*****************************************************************************
* @brief   system task.
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void task_system(const void *argument)
{
	uint32_t tick;
	
	sys_init();
	
	app_timer_task_add(sys_tick_exe);	
	
	while (1)
	{
		sub2_add8(2,200);
		
		fun_list_run_once(nsys);
		fun_list_run_once(napp);
		
		sys_st.info.stack_used = stack_used();

		sys_st.u_tick = app_tick_get();

		// 虚拟RTC
		pulse_create(&sys_st.pulse, sys_st.u_tick);
		if (sys_st.pulse.pulse_1s)
		{
			TimeRun(&sys_st.rtc_time);
		}

		sys_app_run_once();

		tick = app_tick_get();
		//bsp_dly_ms(200);
		sys_st.bsp_dly_verify = app_tick_get() - tick;
		
		NOP1();
		osDelay(ms_ticks(5));
		NOP1();
	}
}

/*****************************************************************************
* @brief   coremark.
*****************************************************************************/
void coremark_demo(void)
{

}
DBG_FUN_EXPORT(coremark_demo);

/*****************************************************************************
* @brief   led control.
*****************************************************************************/
void sys_led_ctr(void)
{
	static word_tt st = {1};
	
	if(sys_st.pulse.pulse_10ms)
	{
		o_led1.out(0);
		o_led2.out(0);
		o_led3.out(0);
	}	
	
	// 位移
	if (sys_st.pulse.pulse_250ms)
	{
		st.uval = bit16_roll_shift_left(st.uval, 5, 1);
		// 输出
		o_led1.out(st.bits.b0);
		o_led2.out(st.bits.b1);
		o_led3.out(st.bits.b2);		
	}
}
DBG_FUN_EXPORT(sys_led_ctr);

/*****************************************************************************
* @brief   key opt.
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void key_opt(void)
{
	io_flt_extv2(&sys_st.key1, 1, sys_st.pulse.pulse_100ms, 3, key1.in_st());
	io_flt_extv2(&sys_st.key2, 1, sys_st.pulse.pulse_100ms, 3, key2.in_st());
	io_flt_extv2(&sys_st.key3, 1, sys_st.pulse.pulse_100ms, 3, key3.in_st());
	io_flt_extv2(&sys_st.key4, 1, sys_st.pulse.pulse_100ms, 3, key4.in_st());
	
	if(sys_st.key1.st.edge_found)
	{
		dbg_puts("key1 press down !\n");
	}
	
	if(sys_st.key2.st.edge_found)
	{
		dbg_puts("key2 press down !\n");
	}
	
	if(sys_st.key3.st.edge_found)
	{
		dbg_puts("key3 press down !\n");
	}
	
	if(sys_st.key4.st.edge_found)
	{
		dbg_puts("key4 press down !\n");
	}
}
obj_app_order(key_opt);

/*****************************************************************************
* @brief   flash opt.
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void sys_flash_init(void)
{

}

/*****************************************************************************
* @brief   str_demo
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void str_demo(void)
{
	
}

/*****************************************************************************
* @brief   iic opt.
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void sw_iic_opt(void)
{
}

/*****************************************************************************
*
* @brief   task switch hook.
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void task_sw_hook(char pos)
{
}
DBG_FUN_EXPORT(task_sw_hook);

/*****************************************************************************
*
* @brief   sys_par_load
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void sys_par_load(void)
{

}

/*****************************************************************************
*
* @brief   sys_tick_exe
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void sys_tick_exe(void)
{
}

/*****************************************************************************
* @brief   system info.
*
* @ Pass/ Fail criteria: none
*****************************************************************************/
void system_info(void)
{
	dbg_puts("=================================================\n");
	dbg_puts("=======================N32G430===================\n");
	dbg_puts("=================================================\n");
}

/*****************************************************************************
* @brief   tick get.
*
* @ Pass/ Fail criteria: tick
*****************************************************************************/
unsigned long rt_tick_get(void)
{
	return app_tick_get();
}

fun_list_hook(nsys)
{

}